//clone一个正则
/*
const reg0 = /ab/ig;
const str = 'ab c ab defg ab e';
const reg1 = new RegExp(reg0);
console.log(reg1); // /ab/gi
console.log(reg1.flags); //gi
console.log(reg1.lastIndex); //0
console.log(reg1.test(str)); //true
console.log(reg1.lastIndex); //2

const reg2 = new RegExp(reg1);
console.log(reg2); // /^abc/gi
console.log(reg2.flags); //gi
console.log(reg1 === reg2); //false
console.log(reg2.lastIndex); //0
*/

/*
const reFlags = /\w*$/

function cloneRegExp(regexp) {
  const result = new regexp.constructor(regexp.source, reFlags.exec(regexp)) //这里直接 new regexp.constructor(regexp) 其实也可以
  result.lastIndex = regexp.lastIndex
  return result
}

cloneRegExp(/xyz/gim)
// => /xyz/gim
*/


const regexp = new RegExp('xyz', 'gim');
// 等价于
// const regexp = /xyz/gim;


console.log(regexp); //  /xyz/gim

//一个正则对象可以大致分成两部分，源码(source) 和修饰符(flags)。
// 比如，/xyz/gim 的 source 是 "xyz"，而其 flags 是 "gim"。

console.log(regexp.source); //xyz
console.log(regexp.flags); //gim


//关于修饰符，多说一句。在 JS 中，目前共有 6 个修饰符：g、i、m、s、u、y。正则对象转化为字符串时，其修饰符排序是按字母排序的。
/*const regexp2 = /xyz/imgyus;
console.log(regexp2.flags);
// => "gimsuy"
console.log(regexp2.toString());
// => "/xyz/gimsuy"*/

//Lodash 的源码，获取修饰符用时没有通过 flags，而是采用正则提取：
console.log(/\w*$/.exec(regexp)); // [ 'gim', index: 5, input: '/xyz/gim', groups: undefined ]
console.log(/\w*$/.exec(regexp).toString()); // gim
//↑ 等价于 regexp.flags


//clone 正则时，还可将其现在的 lastIndex 位置也一并克隆了
/*
var regexp2 = /\d/g;

regexp2.lastIndex
// => 0
regexp2.test("123")
// => true

regexp2.lastIndex
// => 1
regexp2.test("1")
// => false*/

